{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import tensorflow as tf\n",
    "from tensorflow.examples.tutorials.mnist import input_data\n",
    "from matplotlib import pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "tf.logging.set_verbosity(tf.logging.INFO)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Extracting ./train-images-idx3-ubyte.gz\n",
      "Extracting ./train-labels-idx1-ubyte.gz\n",
      "Extracting ./t10k-images-idx3-ubyte.gz\n",
      "Extracting ./t10k-labels-idx1-ubyte.gz\n",
      "(55000, 784)\n",
      "(55000,)\n",
      "(5000, 784)\n",
      "(5000,)\n",
      "(10000, 784)\n",
      "(10000,)\n"
     ]
    }
   ],
   "source": [
    "mnist = input_data.read_data_sets('./');\n",
    "print(mnist.train.images.shape)\n",
    "print(mnist.train.labels.shape)\n",
    "\n",
    "print(mnist.validation.images.shape)\n",
    "print(mnist.validation.labels.shape)\n",
    "\n",
    "print(mnist.test.images.shape)\n",
    "print(mnist.test.labels.shape)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "加载数据，可以看到images里面有55000张测试图像，对应55000个lebel， 以及5000个验证图像对应5000个lebel，10000个测试图像，对应10000个label， 每个图像是28*28像素的灰度图"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n1tfEdYdWctolT/w14vNvvMEukek58DsT313nN6ddjjv95Phhc/NA6c/IDcux1YOjnQfONnGHN+08\nfLM7Jjvtktu0NPH8f6Q7dbNPfcHEwSUzt9Zc7L7Yxzb8qmtTpypn46aIfYRIk76rTTzwc7sub/bm\nQ5x2NQMr/XIWLpFIMmRzxLpjXvibiReeY+eHO95+s9OuwcOl7/s63AkDAOAJSRgAAE/KzXB0UiU7\n/Dh/SHsTLz7HHfZ6Zqsdwnrv/jNN3PzdsKGuDDu8OLN5R6dOn2PXRqTstksoUr6eXthuIwr/O/H5\nQMn9XDnwD7vkod75c2N6/jov2mv/zQa7Zdbdw3/Lr3m+Fnxuf68aMBwtIiIqxf3zU6FLdMO7h/3P\nDjG2DBuCDsqZt8i26+3WndjPjoE+ducIE3etlOW0Cw5Pf51+uPskDEcXKGfLFhPPGGmndGoscZcJ\n5SyMPBUUreRd+d9PtuuxwClve7jIL1XsuBMGAMATkjAAAJ6QhAEA8CRh54STqrjb1K1+s7GJF3e2\nyxOe2tLSaTfh5pNNnPbtzxGfP/hV+ipbtjt1gyZPNPGodfar+du+PkCnEZPDK9htJsO3xJu60C4r\nyZCiz+Glz7bzuT/sdZc51Z6THd7c0CpiVbmV3KiBU5565Fv5tntmazOn3PoFO9eYE944SnVG2Lnk\nsX2PMnHXepHnmBG72qP8/Lv2rPO7U35DGkRo6Q93wgAAeEISBgDAk4Qajg4OQc9/8jCnLjgE/cTm\nVib+rldbp13yssJ/XX7lte6QdrfKE0y8+SD7fK/WaO+0y9m6rdCvhb86ZfaFJv7ysHedujFdR5n4\nIXGXkkUru5vdVe2gB+w0RLMU9/rVuX2ZiXd95D6Hyv/c8nJt+aX1Itbt1HYZy9sPn+nUVZ8beZoo\nFkuvbWLiH8e7p6V1qRgy8aJ+bn+b3Wt3hNLZkaciUPwyz+rslK/tPjHfdh9u6BT2k9K3PJA7YQAA\nPCEJAwDgSUINR/95ZQcTL+71rFP3yW67yf9357Yzcfay5UV+3X3VI481zttrh7AYfo6PtEH21/j5\n992pgX7VF5p44XNHm7jtf9c67dafbr81ec5Nk5y63jXsoR71UoKnNLgnNrzabLyJe/ZwN47Prsx4\ntIhIcu1aJr7zmncjtnt/h/1We/U3inf4OVzOHLur0jUT+jl1i3vZaax5vd2/KWd/ENiGa9rs+HSu\n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\n4hLFAAAAAElFTkSuQmCC\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x26792da2080>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.figure(figsize=(8,8))\n",
    "\n",
    "for idx in range(16):\n",
    "    plt.subplot(4,4,idx+1)\n",
    "    plt.axis('off')\n",
    "    plt.title('[{}]'.format(mnist.train.labels[idx]))\n",
    "    plt.imshow(mnist.train.images[idx].reshape(28,28))"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来定义用于训练的网络，首先，定义网络的输入\n",
    "需要分别定义x（图像数据作为输入），y（label，图片真实代表的数字），learning_rate学习率的placeholder\n",
    "\n",
    "为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，x,y 两个placeholder的第一个维度就是batchsize，，因为还没有确定，所以第一个维度留空"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "x = tf.placeholder('float',[None,784])\n",
    "y = tf.placeholder('int64',[None])\n",
    "learning_rate = tf.placeholder('float')\n",
    "\n",
    "def initialize(shape,stddev = 0.1):\n",
    "    return tf.truncated_normal(shape,stddev=0.1) \n",
    "# truncated_normal获得正态分布初始化一个shape的值,stddev:正态分布的标准差\n",
    "\n",
    "L1_units_count = 100\n",
    "\n",
    "W_1 = tf.Variable(initialize([784,L1_units_count]))\n",
    "b_1 = tf.Variable(initialize([L1_units_count]))\n",
    "logits_1 = tf.matmul(x,W_1) + b_1\n",
    "output_1 = tf.nn.relu(logits_1)\n",
    "\n",
    "L2_units_count = 10\n",
    "W_2 = tf.Variable(initialize([L1_units_count,L2_units_count]))\n",
    "b_2 = tf.Variable(initialize([L2_units_count]))\n",
    "logits_2 = tf.matmul(output_1,W_2) + b_2\n",
    "\n",
    "logits = logits_2"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "接下来定义loss和用于优化网络的优化器。loss计算是用了sparse_softmax_cross_entropy_with_logits,这样做的好处是labels可以不用手动做one_hot省了一些麻烦。这里使用了sgd优化器，学习率为可以根据需要设定。\n",
    "## 试试看，增大减小学习率，换个优化器再进行训练会发生什么。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "cross_entropy_loss = tf.reduce_mean(\n",
    "    tf.nn.sparse_softmax_cross_entropy_with_logits(logits=logits,labels = y))\n",
    "\n",
    "# 定义优化器，使使cross_entropy损失最小化损失最小化, 这里是用的优化过的梯度下降SGD\n",
    "# 它使用一条数据计算梯度，或者 使用batch_size条数据\n",
    "#这个操作每次执行都会前项一次反向一次，对参数进行优化\n",
    "\n",
    "optimizer = tf.train.GradientDescentOptimizer(\n",
    "learning_rate=learning_rate).minimize(cross_entropy_loss)\n",
    "## ！！！GradientDescentOptimizer是优化器，minimize是这个优化器用的操作\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 需要注意的是，上面的网络，最后输出的是未经softmax的原始logits，而不是概率分布， 要想看到概率分布，还需要做一下softmax。\n",
    "\n",
    "将输出的结果与正确结果进行对比，即可得到我们的网络输出结果的准确率。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "pred = tf.nn.softmax(logits)\n",
    "#tf.argmax能给出tensor对象在某一维度上的其数据最大值所在的索引值\n",
    "correct_pred = tf.equal(tf.argmax(pred,1),y)\n",
    "accuracy = tf.reduce_mean(tf.cast(correct_pred,tf.float32))"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 17,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "batch_size = 32\n",
    "train_step = 1000\n",
    "\n",
    "#saver用于保存或恢复训练的模型\n",
    "saver = tf.train.Saver()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "以上定义的所有操作，均为计算图，也就是仅仅是定义了网络的结构，实际需要运行的话，还需要创建一个session，并将数据填入网络中。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 18,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "after 100 training steps, the loss is 0.29588, the validation accuracy is 0.8742\n",
      "after 200 training steps, the loss is 0.467573, the validation accuracy is 0.9206\n",
      "after 300 training steps, the loss is 0.355686, the validation accuracy is 0.9188\n",
      "after 400 training steps, the loss is 0.122085, the validation accuracy is 0.9352\n",
      "after 500 training steps, the loss is 0.0774122, the validation accuracy is 0.9448\n",
      "after 600 training steps, the loss is 0.20712, the validation accuracy is 0.9446\n",
      "after 700 training steps, the loss is 0.287268, the validation accuracy is 0.9418\n",
      "after 800 training steps, the loss is 0.495764, the validation accuracy is 0.9486\n",
      "after 900 training steps, the loss is 0.108949, the validation accuracy is 0.9546\n",
      "the training is finish!\n",
      "the test accuracy is:  0.9501\n"
     ]
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    sess.run(tf.global_variables_initializer())\n",
    "    \n",
    "    # 定义验证集与测试集\n",
    "    validate_data={\n",
    "        x:mnist.validation.images,\n",
    "        y:mnist.validation.labels,\n",
    "    }\n",
    "    test_data = {x:mnist.test.images,y:mnist.test.labels}\n",
    "    \n",
    "    for i in range(train_step):\n",
    "        xs, ys = mnist.train.next_batch(batch_size=batch_size)\n",
    "        _,loss = sess.run(\n",
    "            [optimizer, cross_entropy_loss],\n",
    "            feed_dict={\n",
    "                x: xs,\n",
    "                y: ys,\n",
    "                learning_rate:0.3\n",
    "            }\n",
    "        )\n",
    "        \n",
    "        # 每100次训练打印一次损失值与验证准确率\n",
    "        if i>0 and i%100 == 0:\n",
    "            validate_accuracy = sess.run(accuracy,feed_dict=validate_data)\n",
    "            print(\n",
    "            \"after %d training steps, the loss is %g, the validation accuracy is %g\"%(\n",
    "            i,loss,validate_accuracy))\n",
    "            \n",
    "            saver.save(sess,'./model.ckpt',global_step=i)\n",
    "    print('the training is finish!')\n",
    "    #最终的测试准确率\n",
    "    acc = sess.run(accuracy,feed_dict=test_data)\n",
    "    print('the test accuracy is: ',acc)\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "下面，用我们训练的模型做一个测试。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "INFO:tensorflow:Restoring parameters from ./model.ckpt-900\n",
      "0.9375\n"
     ]
    },
    {
     "data": {
      "image/png": "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\ndkUrre6zM2KtIhFRWDwSJiIiCgg7YSIiooCwEyYiIgoI54QpKW3/rLUX/9L1+ajek5XPrex/Pe4V\nL36ze30r7d2venlxztIVUdaQShLp1tFa/uyT8V7c+aWhXtz4Ac7/F7fU6tW8eNnzLbzYv00CwF2b\nunnxzwPbWGk5S5YnqHaJxyNhIiKigLATJiIiCgiHoykp+IefAeCHru9E9b6Xdpjhradm9vHiZk03\nW/m+7PCBFw+sst5Ke+iS2l7c4jYORyejTYdVtZazkePFldbxkbtBym3eyIt/7v2yF4dOHz140Fwv\n7nLmkVZaYw5HExERUWGxEyYiIgoIh6OpxMo+wZwNObXLCyGpaV709HZzpuQ353W3s63b5IVtts/x\n4pQKFaxsD8/q7MV31P7ZrkeN7KjrTCXT9oNzrOU12ZleXGvszOKuTplWrnEja7n5mN8CqknJwCNh\nIiKigLATJiIiCgg7YSIiooAk9Zzw1iuPsJabDDJzC79uqmulHcg0c4gN3zZxpTV7rHy5C5bEs4oU\ngz0Ny3txSsjvRf888LTTzXxuzsplUZX9232HWMtv1XzSt5RupTWazN+qyUiP6urF35/2lJXW67t/\ne3ErzC+2OpVVf95jLinq9i97H/tY/e8LXV7GkfYlhn/dbcqvvcicw1Hx49mFLru4ce9CREQUEHbC\nREREAUnq4ehbh79lLZ9debtZaJnPG3ubcHX231bSM5uPi71iUZq9qakXV36ympVWbsrc0OxlTvX/\nmktHzplzkZUm23d5cfb61YUu+4pTvraWM1LSI+SkZLWtQ0Uvrp9ayUpr+H5aaHZKoEVXP+fFWZqT\nT87oTOvypv1CFxN+uNc8gGXc7v5WtnJTS95+lUfCREREAWEnTEREFBB2wkRERAFJ6jnhZ+8431q+\n52Dzm6LGUvsRHNvbixeXP3iHFz/W6QMr36j6s7z4s78zvPjUSvalTPnZpwe8eFZmZS/uXSHLzuj7\nrFbnXW0ltZkS9ceVCfF4aPfqh8wlbZdXfyIk1dzG8ub1Pa2UKl8vNfWIuRZUXE4YYs4p+GhvdSst\nY5q5lI1tmhhp08zcbJqkxlze/AO5Xrw6q46VdmblbV58boa5Ve2548dY+U5r2A0lDY+EiYiIAsJO\nmIiIKCBJPRxd+f1ZIcuR81aN8Ppz9Xpbyw8e1cy851tzB67HereKul7l9plhk8qLzAPia3030crX\n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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x267929c2be0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "with tf.Session() as sess:\n",
    "    ckpt = tf.train.get_checkpoint_state('./')\n",
    "    if ckpt and ckpt.model_checkpoint_path:\n",
    "        saver.restore(sess, ckpt.model_checkpoint_path)\n",
    "        \n",
    "        final_pred,acc = sess.run(\n",
    "            [pred,accuracy],\n",
    "            feed_dict={\n",
    "                x:mnist.test.images[:16],\n",
    "                y:mnist.test.labels[:16]\n",
    "            }\n",
    "        )\n",
    "        orders = np.argsort(final_pred)\n",
    "        plt.figure(figsize=(8,8))\n",
    "        print(acc)\n",
    "        for idx in range(16):\n",
    "            order = orders[idx,:][-1]\n",
    "            prob = final_pred[idx,:][order]\n",
    "            plt.subplot(4,4,idx+1)\n",
    "            plt.axis('off')\n",
    "            plt.title('{}: [{}]-[{:.1f}%]'.format(mnist.test.labels[idx],order,prob*100))\n",
    "            plt.imshow(mnist.test.images[idx].reshape((28,28)))\n",
    "    else:\n",
    "        pass\n",
    "            "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "第三行第一个预测错了，正确率跟老师链接中的不一样，其原因可能是因为 tf.truncated_normal(shape,stddev=0.1) 这里的随机导致的？\n",
    "\n",
    "\n",
    "1.对模型结构的理解10分。\n",
    "    模型结构：\n",
    "        a.模型训练是使用小批次训练的，每次的batch_size是32，总共训练1000次(training_step=1000)\n",
    "        \n",
    "        b. 模型定义中，输入数据的维度是784，L1层定义了100个节点，L2层定义了10个节点，因为模型的输出需求是判断0-9这10个数字。其中的各个节点采用全连接的方式，因为：\n",
    "            W_1 = tf.Variable(initialize([784, L1_units_count]))\n",
    "            W_2 = tf.Variable(initialize([L1_units_count, L2_units_count]))\n",
    "            \n",
    "        c.第一层的激活函数采用的relu激活函数,生成第一层的输出output_1 作为第二层的输入，第二层logits_2 = tf.matmul(output_1, W_2) + b_2， 然后logits_2再经过softmax，将每个类别所对应的输出分量归一化，使各个分量的和为1，将logits_2分类为每个类别的概率。\n",
    "        \n",
    "        d.神经网络的输出层经过Softmax函数作用后，接下来就要计算我们的loss了，这个这里是使用了Cross-Entropy交叉熵作为了loss function。\n",
    "        sparse_softmax_cross_entropy_with_logits()输入的label格式为一维的向量，所以首先需要将其转化为one-hot格式的编码，而如果你的label已经是one-hot格式，则可以使用tf.nn.softmax_cross_entropy_with_logits()函数来进行softmax和loss的计算。（网上查的）,\n",
    "        最后tf.reduce_mean()对batch_size里每个样本的loss求平均，计算最后的cost值\n",
    "        \n",
    "        e. 优化算法optimizer 采用的是SGD优化器, SGD优化器在每次训练执行最小化cross_entropy_loss的操作\n",
    "        \n",
    "2.对模型训练过程（梯度如何计算，参数如何更新）的理解10分。 \n",
    "    模型训练过程：\n",
    "        a. 为了让网络更高效的运行，多个数据会被组织成一个batch送入网络，两个placeholder的第一个维度就是batchsize，每次的batch_size是32，总共训练1000次(training_step=1000)\n",
    "        b. 每个step训练中，我们这里都做了两件事：\n",
    "            （i）计算cross_entropy_loss里面的loss\n",
    "            （ii）执行optimizer中的任务，它的任务是最小化cross_entropy_loss。\n",
    "            运行过程是，将每个批次的数据输入到网络，经过L1层，L2层，获得最终的输出，然后根据输出，计算交叉熵损失，再根据梯度下降算法，获得L2层各个分量的delta，然后更新L2中的W_2 ，再计算 L1层各个分量的delta，更新W_1，如此，正向传播一次反向传播一次，各个W得到一次更新，总共训练1000次\n",
    "            \n",
    "    \n",
    "3.对计算图的理解10分。\n",
    "    计算图中，首先将会变化的量使用tf.placeholder去定义，比如x，y，learning_rate 。 另外一些变量在定义的时候，就给了初始值tf.Variable，比如W_1，W_2，b_1，b_2，都使用了 initialize方法，根据所需要的维度，产生了一个范围内的高斯分布的随机值。logits_1，logits_2 和 output_1 都定义了要执行的操作。\n",
    "    \n",
    "    在执行训练的时候，首先要创建一个Session，with tf.Session() as sess， sess的作用我的理解，就是一个执行器，要想执行操作必须通过session.run()方法。\n",
    "    第一步必须做的是初始化所有tensor：global_variables_initializer。 可以理解为，前面的placeholder和Variable，计算操作，都是在定义类，这里经过global_variables_initializer之后都实例化成了对象，就能直接使用了。要是要想执行命令，仍然要通过sess.run()方法。 \n",
    "    \n",
    "4.解释这⾥的模型为什么效果⽐较差10分。\n",
    "    a.learning_rate是一个固定的值，而且是0.3对应训练后期可能比较大，在模型到达损失最低点之前产生震荡。\n",
    "    b.优化算法上，采用的SGD，有可能不能得出最好的结果，可以试试其他的优化算法\n",
    "    c. 目标函数没有加入正则项,导致模型训练集上的效果好于测试集，产生过拟合。\n",
    "    d. 模型的L1层的神经元个数可能不合适，而且隐层只有一层\n",
    "    e. 模型的初始化方式采用的是“服从固定方差的独立高斯分布”，可以尝试采用其他的Xavier初始化或者MSRA初始化。\n",
    "    f. 可以增加训练次数，这里只训练了1000次\n",
    "    "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "问题总结：\n",
    "1.建立Level1的100个节点是怎么确定的？经验值吗\n",
    "\n",
    "2.代码都一样，正确率跟老师链接中的不一样，其原因可能是因为 tf.truncated_normal(shape,stddev=0.1) 这里的随机导致的？\n",
    "\n",
    "3.save方法生成的文件，每次调用生成了三个，大概都是什么作用？\n",
    "\n",
    "4.选择relu激活函数有什么考虑吗？使用其他的激活函数行不行\n",
    "\n",
    "5.怎么继续训练\n",
    "\n",
    "\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
